문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 객체 지향 프로그래밍 (문단 편집) === C언어와 객체지향 === C언어는 문법적으로 객체 지향을 지원하지 않으나, C언어로 객체 지향적인 구현이 불가능한 것은 아니다. [[Linux|리눅스]] [[커널]]을 만든 [[리누스 토르발스]]의 말을 들어보자. "you can write object-oriented code (useful for filesystems etc) in C, _without_ the crap that is C++." [[http://harmful.cat-v.org/software/c++/linus|링크]] --C++가 구리다는 말은 넘어가자-- C를 C++로 확장시키고 최초의 C++ 컴파일러를 만든 비아르네 스트로우스트루프의 경우 처음 컴파일러를 구현할 때 C++를 C 언어로 변환시키는 인터프리터를 통해 만들었다. (물론 현존하는 대부분의 컴파일러는 C++을 C로 바꾸는 작업을 하지 않고 바로 컴파일을 수행한다.) 즉, C로 객체지향 코딩이 가능하다는 말. 스트로우스트루프가 직접 저술한 The C++ Programming Language 책에 해당 내용을 언급한다. 이걸 실용적으로 쓰는 분야도 있다. [[임베디드 시스템|임베디드나 펌웨어]] 관련 프로젝트에서는 여러가지 사정으로 (여러 플랫폼에 포팅 가능해야 한다거나, 툴체인을 지원하지 않는다거나) C언어를 사용하여 큰 규모의 소스코드를 작성해야 할 경우가 많은데 이런 경우에는 객체지향적인 설계를 도입해야 모듈이나 레이어 사이의 혼잡을 피할 수 있다. 따라서 이런 프로그래머들은 객체지향적인 C의 설계는 반드시 익혀야 할 내용이다. 객체 지향은 [[Java]]나 [[Python]]처럼 복잡하지 않아도, 구조체에 함수 포인터 정도만 할당해도 쉽게 구현할 수 있다. 이는 객체 지향이라는 것은 어디까지나 언어의 패러다임에 불과하므로 그 구현을 직접 구현해야 하는 것만 빼면 (상속은 Struct 안에 부모의 Struct을 포함한다거나, C++ 클래스의 vtable을 받아 오고 클래스 멤버에 그 클래스 컨텍스트의 포인터를 지정해 {{{this}}}포인터를 구현하거나 하는 등) 아무 문제 없이 구현이 가능하고 임베디드와 같이 메모리 용량이 한정적인 환경에서는 C++구동에 필요한 C++ 런타임의 용량 또한 무시할 수 없는 크기를 가지고 있기 때문에 중요하게 사용된다. 임베디드 뿐만 아니라 다른 영역에서도 자주 쓰이는 방법중 하나로 라이브러리의 래퍼를 만들 때도 자주 사용된다. 예를 들어 어떤 라이브러리가 C++로 만들어져 있고 API는 클래스와 템플릿으로만 이루어져 있을 때, 이를 [[C언어]] 그 차체나 [[Rust(프로그래밍 언어)|Rust|]], [[Python]]등의 다른 언어에서 사용할 수 있도록 다른 언어로 래핑하는 경우에도 C를 사용해 객체지향을 구현하고 이 심볼을 cdecl로 노출시켜 다른 언어에서 사용 ([[Python]]의 {{{ctypes.cdll.LoadLibrary}}}와 같이)하는 경우에도 사용된다. 실제로 [[Windows]] 개발에 사용되는 [[Windows API#COM|COM]]이 이런 식으로 구현되어 있어 언어에 상관 없이 ABI를 노출시켜 객체지향적인 방법으로 사용되고 있다. C가 아닌 다른 언어를 예를 들면 [[자바스크립트]]에서는 해시 테이블 하나로 객체 지향을 몽땅 구현하는 것을 참고하자. [[Java]]나 [[Python]]프로그래머들조차 객체 지향에서 필요한 기능만을 반복적으로 사용하지, 모든 기능을 뒤섞어 사용하면 코드가 난잡해지기 때문에 피하는 경우가 많다. 대부분의 경우에는 굳이 C로 구현해서 쓰기보다는 Java나 C# 같은 고수준 언어를 찾아보는 것이 좋다. ABI(Application Binary Interface)가 필요한 경우가 아니라면 C 같은 저수준 언어는 무의미하다. 하지만 [[C(프로그래밍 언어)|C]]를 이용해 객체 지향 프로그래밍을 한다는 것 자체가 [[난해한 프로그래밍 언어]]에 가까운 기술이고, [[C(프로그래밍 언어)|C]]를 이용해 프로그래밍을 하는 대부분의 상황 자체가 로봇이나 기계를 어떤 식으로 움직이라는 등 단순한 논리를 하드웨어에 맞추어 가장 빠르게 구현하는 것이 대부분이기 때문에 객체 지향을 도입할 필요가 있다면 비즈니스 요구 사항부터 잘못되었을 가능성이 크다. 만약에 객체 지향을 굳이 [[C(프로그래밍 언어)|C]]로 하는게 필요하다면, 일반적인 상황이 아니고 정부기관, 연구소, 군대 등 굳이 [[C(프로그래밍 언어)|C]]만을 써야 하는 레거시 시스템이 존재하는 곳에서 어쩔 수 없이 큰 비용을 지출하며 전문가들을 뽑아서 프로그래밍을 시켜야 할 것이다. 일반적인 경우 고성능과 객체 지향이 동시에 필요하다면 아예 [[C++]]나 [[Rust]]를 공부하고 새로 개발하는게 더 낫다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기